<?php

namespace Gds\VenteBundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Sensio\Bundle\FrameworkExtraBundle\Configuration\Template;
use Gds\VenteBundle\Form\BonLivraisonRetourClientType;
use Gds\VenteBundle\Entity\BonLivraisonRetourClient;
use Symfony\Component\HttpFoundation\Response;
use Gds\VenteBundle\Entity\LigneBonLivraisonRetourClient;
use Gds\AchatBundle\Entity\StockAchat;

class _BonLivraisonRetourController extends Controller {

    public function indexAction() {
        $em = $this->getDoctrine()->getEntityManager();
        $societe = $em->getRepository('GdsArticleBundle:Societe')->findAll()[0];
        $ref = $societe->getPrefixeBonRetour();
        $ref_num = $societe->getNumeroBonRetour();
        $bon_retour = new BonLivraisonRetourClient();
        $bon_retour->setReference($ref . ' ' . $ref_num);
        $form = $this->createForm(new BonLivraisonRetourClientType, $bon_retour);
        $user = $this->getUser();
        return $this->render('GdsVenteBundle:BonRetour:bon_retour.html.twig', array('form' => $form->createView(), 'user' => $user));
    }

    public function getBonLivraisonsAction() {
        $em = $this->getDoctrine()->getEntityManager();
        $request = $this->getRequest();
        $date = $request->get('date');
        $id_departement = $request->get('departement');
        $id_client = $request->get('client');
        $departement = $em->getRepository('GdsArticleBundle:Departement')->find($id_departement);
        $client = $em->getRepository('GdsVenteBundle:Client')->find($id_client);
        $bons_livraisons = $em->getRepository('GdsVenteBundle:BonLivraisonClient')->getWhereDateClientDepartement($date, $client, $departement);
        $result = array();
        foreach ($bons_livraisons as $bon_livraison) {
            $bl = array();
            $bl['reference'] = $bon_livraison->getReference();
            $bl['id'] = $bon_livraison->getId();
            $result[] = $bl;
        }
        $response = new Response(json_encode($result));
        $response->headers->set('Content-Type', 'application/json');
        return $response;
    }

    public function bonRetourAction() {
        $em = $this->getDoctrine()->getEntityManager();
        $request = $this->getRequest();
        $ids = json_decode($request->get('ids'));
        $bon_livraison = $em->getRepository('GdsVenteBundle:BonLivraisonClient')->find($ids[0]);
        $client = $bon_livraison->getClient();
        $societe = $em->getRepository('GdsArticleBundle:Societe')->findAll()[0];
        $user = $this->getUser();
        $departement = $user->getDepartement();
        $ref = $societe->getPrefixeBonRetour();
        $ref_num = $societe->getNumeroBonRetour();
        $bon_retour = new BonLivraisonRetourClient();
        $bon_retour->setReference($ref . ' ' . $ref_num);
        $form = $this->createForm(new BonLivraisonRetourClientType, $bon_retour);
        if ($request->isMethod('POST')) {
            $articles = json_decode($request->get('articles'));
            $quantite_retour = 0;
            foreach ($articles as $article)
                $quantite_retour += $article->quantite;
            if ($quantite_retour == 0) {
                $response = new Response(json_encode(array('success' => false)));
                $response->headers->set('Content-Type', 'application/json');
                return $response;
            }
            $bons_livraison = array();
            foreach ($ids as $id) {
                $bon_livraison = $em->getRepository('GdsVenteBundle:BonLivraisonClient')->find($id);
                $bons_livraison = $this->includeBon($bon_livraison, $bons_livraison);
            }
            $form->bind($request);
            $bon_retour = $form->getData();
            $montant_blanc_ttc = 0;
            $montant_noir_ttc = 0;
            foreach ($articles as $article) {
                $ligne = new LigneBonLivraisonRetourClient();
                $art = $em->getRepository('GdsArticleBundle:Article')->find($article->id);
                $quantite = $article->quantite;
                $qte_bl = 0;
                $i = 0;
                while ($i < count($bons_livraison) && $quantite > 0) {
                    $bon_livraison = $bons_livraison[$i];
                    $ligne_bon_livraison = $em->getRepository('GdsVenteBundle:LigneBonLivraisonClient')->findOneBy(array('bon_livraison' => $bon_livraison, 'article' => $art));
                    if ($ligne_bon_livraison) {
                        $bon_livraison->setIsCloturer(true);
                        $quantite_blanc = $ligne_bon_livraison->getQuantiteBlanc() - $ligne_bon_livraison->getQuantiteRetourBlanc();
                        $quantite_noir = $ligne_bon_livraison->getQuantiteNoir() - $ligne_bon_livraison->getQuantiteRetourNoir();
                        $quantite_ret_bl = 0;
                        $quantite_ret_noir = 0;
                        if ($quantite > $quantite_blanc) {
                            $quantite -= $quantite_blanc;
                            $qte_bl += $quantite_blanc;
                            $quantite_ret_bl += $quantite_blanc;
                        } else {
                            $qte_bl += $quantite;
                            $quantite_ret_bl += $quantite;
                            $quantite = 0;
                        }
                        if ($quantite > $quantite_noir) {
                            $quantite -= $quantite_noir;
                            $quantite_ret_noir += $quantite_noir;
                        } else {
                            $quantite_ret_noir += $quantite;
                            $quantite = 0;
                        }
                        $ligne_bon_livraison->setQuantiteRetourBlanc($ligne_bon_livraison->getQuantiteRetourBlanc() + $quantite_ret_bl );
                        $ligne_bon_livraison->setQuantiteRetourNoir($ligne_bon_livraison->getQuantiteRetourNoir() + $quantite_ret_noir );
                        $reference = $bon_livraison->getReference();
                        $histories = $em->getRepository('GdsVenteBundle:HistoryBonLivraisonClient')->findByReference($reference);
                        $history = $histories[count($histories) - 1];
                        $ligne_history = $em->getRepository('GdsVenteBundle:HistoryLigneBonLivraisonClient')->findOneBy(array('history_bon_livraison' => $history, 'article' => $art));
                        $ligne_history->setQuantiteRetour($ligne_bon_livraison->getQuantiteRetour());
                    }
                    $i++;
                }
                $ligne->setArticle($art);
                $ligne->setPrixUnitaireHt($article->prix_vente);
                $ligne->setQuantiteBlanc($qte_bl);
                $ligne->setQuantiteNoir($article->quantite - $qte_bl);
                $ligne->setTauxRemise($article->remise);
                $ligne->setTauxTva($article->taux_tva);
                $ligne->setBonLivraisonRetour($bon_retour);
                $em->persist($ligne);
                $qte_noir = $article->quantite - $qte_bl;
                $stock = $em->getRepository('GdsArticleBundle:Stock')->findOneBy(array('article' => $art, 'departement' => $departement));
                $stock->setQuantiteBlanc($stock->getQuantiteBlanc() + $qte_bl);
                $stock->setQuantiteNoir($stock->getQuantiteNoir() + $qte_noir);
                $prix_achat_ttc = $article->prix_vente * (1 + $article->taux_tva / 100) * (1 - $article->remise / 100);
                if ($qte_bl > 0) {
                    $stock_achat_blanc = $em->getRepository('GdsAchatBundle:StockAchat')->findOneBy(array('stock' => $stock, 'prix_achat_ttc' => $prix_achat_ttc, 'is_noir' => 0));
                    if ($stock_achat_blanc) {
                        $stock_achat_blanc->setQuantite($stock_achat_blanc->getQuantite() + $qte_bl);
                    } else {
                        $stock_achat_blanc = new StockAchat();
                        $stock_achat_blanc->setIsNoir(0);
                        $stock_achat_blanc->setPrixAchatTtc($prix_achat_ttc);
                        $stock_achat_blanc->setQuantite($qte_bl);
                        $stock_achat_blanc->setStock($stock);
                        $em->persist($stock_achat_blanc);
                    }
                }
                if ($qte_noir > 0) {
                    $stock_achat_noir = $em->getRepository('GdsAchatBundle:StockAchat')->findOneBy(array('stock' => $stock, 'prix_achat_ttc' => $prix_achat_ttc, 'is_noir' => 1));
                    if ($stock_achat_noir) {
                        $stock_achat_noir->setQuantite($stock_achat_noir->getQuantite() + $qte_bl);
                    } else {
                        $stock_achat_noir = new StockAchat();
                        $stock_achat_noir->setIsNoir(1);
                        $stock_achat_noir->setPrixAchatTtc($prix_achat_ttc);
                        $stock_achat_noir->setQuantite($qte_noir);
                        $stock_achat_noir->setStock($stock);
                        $em->persist($stock_achat_noir);
                    }
                }
                $montant_blanc_ttc += $qte_bl * $prix_achat_ttc;
                $montant_noir_ttc += $qte_noir * $prix_achat_ttc;
            }
            $bon_retour->setClient($client);
            $bon_retour->setHeure($request->get('heure'));
            $bon_retour->setMontantBlancTtc($montant_blanc_ttc);
            $bon_retour->setMontantNoirTtc($montant_noir_ttc);
            $bon_retour->setReste($montant_blanc_ttc + $montant_noir_ttc);
            $bon_retour->setUser($user);
            $em->persist($bon_retour);
            $societe->setNumeroBonRetour($societe->getNumeroBonRetour() + 1);
            $solde_client = $client->getSolde();
            $client->setSolde($solde_client - $montant_blanc_ttc - $montant_noir_ttc);
            $em->flush();
            $response = new Response(json_encode(array('success' => true)));
            $response->headers->set('Content-Type', 'application/json');
            return $response;
        }
        return $this->render('GdsVenteBundle:BonRetour:form_bon_retour.html.twig', array('form' => $form->createView(), 'user' => $user, 'client' => $client, 'ids' => $ids));
    }

    function includeBon($bon_livraison, $bons_livraison) {
        $i = 0;
        $stop = false;
        while ($i < count($bons_livraison) && !$stop) {
            $date1 = $bons_livraison[$i]->getDate();
            $date2 = $bon_livraison->getDate();
            $heure1 = $bons_livraison[$i]->getHeure();
            $heure2 = $bon_livraison->getHeure();
            if ($date1 > $date2 || ($date1 == $date2 && $heure1 > $heure2))
                $stop = true;
            else
                $i++;
        }
        $new_bons = array();
        if (!$stop) {
            $new_bons = $bons_livraison;
            array_push($new_bons, $bon_livraison);
        } else {
            foreach ($bons_livraison as $cle => $bon) {
                if ($cle == $i)
                    array_push($new_bons, $bon_livraison);
                array_push($new_bons, $bon);
            }
        }
        return $new_bons;
    }

    public function getArticlesFromBlsAction() {
        $em = $this->getDoctrine()->getEntityManager();
        $request = $this->getRequest();
        $ids = json_decode($request->get('ids'));
        $lines = array();
        $articles = array();
        foreach ($ids as $id) {
            $bon_livraison = $em->getRepository('GdsVenteBundle:BonLivraisonClient')->find($id);
            $lignes = $em->getRepository('GdsVenteBundle:LigneBonLivraisonClient')->findBy(array('bon_livraison' => $bon_livraison));
            foreach ($lignes as $ligne) {
                $article = $ligne->getArticle();
                if (!$this->isArticleExist($article, $articles)) {
                    $articles[] = $article;
                    $line = array();
                    $taux_tva = $article->getTauxTva();
                    $line['reference'] = $article->getReference();
                    $line['designation'] = $article->getDesignation();
                    $line['code_barre'] = $article->getCodeBarre();
                    $line['taux_tva'] = $taux_tva;
                    $line['quantite1'] = $ligne->getQuantiteBlanc();
                    $line['quantite2'] = $ligne->getQuantiteNoir();
                    $line['quantite_retour'] = $ligne->getQuantiteRetour();
                    $line['quantite'] = 0;
                    $line['prix_vente'] = $ligne->getPrixUnitaireHt();
                    $line['remise'] = $ligne->getTauxRemise();
                    $line['prix_vente_max_ttc'] = $line['prix_vente'] * (1 + $line['taux_tva'] / 100) * (1 - $line['remise'] / 100);
                    $line['remise_min'] = $line['remise'];
                    $name = $article->getReference() . ' : ' . $article->getDesignation();
                    $line['name'] = $name;
                    $line['id'] = $article->getId();
                    $lines[] = $line;
                } else {
                    $k = $this->getIndexLines($article, $lines);
                    $lines[$k]['quantite1'] += $ligne->getQuantiteBlanc();
                    $lines[$k]['quantite2'] += $ligne->getQuantiteNoir();
                    $lines[$k]['quantite_retour'] += $ligne->getQuantiteRetour();
                    $lines[$k]['prix_vente'] = min($lines[$k]['prix_vente'], $ligne->getPrixUnitaireHt());
                    $lines[$k]['prix_vente_max_ttc'] = $lines[$k]['prix_vente'] * (1 + $lines[$k]['taux_tva'] / 100) * (1 - $lines[$k]['remise'] / 100);
                    $lines[$k]['remise'] = max($lines[$k]['remise'], $ligne->getTauxRemise());
                    $lines[$k]['remise_min'] = $lines[$k]['remise'];
                }
            }
        }
        $response = new Response(json_encode($lines));
        $response->headers->set('Content-Type', 'application/json');
        return $response;
    }

    public function IsPasswordTrueAction() {
        $em = $this->getDoctrine()->getEntityManager();
        $request = $this->getRequest();
        $password = $request->get('password');
        $societe = $em->getRepository('GdsArticleBundle:Societe')->findAll()[0];
        $code_secret = $societe->getCodeSecret();
        if ($password == $code_secret)
            $response = new Response('true');
        else
            $response = new Response('false');
        return $response;
    }

    function isArticleExist($art, $articles) {
        foreach ($articles as $article) {
            if ($article->getId() == $art->getId())
                return true;
        }
        return false;
    }

    function getIndexLines($article, $lines) {
        foreach ($lines as $k => $line) {
            if ($line['id'] == $article->getId())
                return $k;
        }
        return null;
    }

}
